package repertorioInstrucciones;

import comun.Natural;

import maquina.Dato;
import maquina.PilaTrabajo;

public class DesapilaDir extends Instruccion {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public DesapilaDir(int dir){
		super(dir);
	}
	public PilaTrabajo accion(PilaTrabajo pilaT) {
		//guardo en la direccion de memoria dir el valor de la cima de pila
		Dato d = (Dato) pilaT.getMem().get((Integer)this.parametros.get(0));
		Dato d2 = (Dato) pilaT.getPila().pop();
		//el dato de memoria es Natural, compruebo que no sea negativo
		if (d.getDato() instanceof Natural){
			if(d2.getDato() instanceof Natural){
				int n2 = ((Natural) d2.getDato()).getValor();
				if(n2<0){
					pilaT.getMem().set((Integer) this.parametros.get(0),new Dato<Natural>(new Natural(0)));
					return pilaT;
				}
				else{
					pilaT.getMem().set((Integer) this.parametros.get(0),new Dato<Natural>(new Natural(n2)));
					return pilaT;
				}
			}
			else
				if(d2.getDato() instanceof Integer){
					int n2 = (Integer) d2.getDato();
					if(n2<0){
						pilaT.getMem().set((Integer) this.parametros.get(0),new Dato<Natural>(new Natural(0)));
						return pilaT;
					}
					else {
						pilaT.getMem().set((Integer) this.parametros.get(0),new Dato<Natural>(new Natural(n2)));
						return pilaT;
					}
				}
		}
		else{
			pilaT.getMem().set((Integer) this.parametros.get(0),d2);
			return pilaT;
		}
		//return null;
		return pilaT;
	}

}
